package top.jolyoulu.corecommon.queue.delayed.observer;

import lombok.Getter;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import top.jolyoulu.corecommon.queue.delayed.DelayedTaskEntity;

import java.lang.reflect.Type;

/**
 * @Author: JolyouLu
 * @Date: 2023/4/15 19:51
 * @Description
 */
@Getter
public abstract class AbstractObserver<T> implements Observer{

    private final Class<T> ObserverClass;

    /**
     * 你需要观察的那个对象Class
     * 如：super(GenCodeFormBO.class);
     * @param observerClass 需要观察的对象Class
     */
    protected AbstractObserver() {
        Type superclass = getClass().getGenericSuperclass();
        Type[] types = ((ParameterizedTypeImpl) superclass).getActualTypeArguments();
        if (types.length < 1){
            throw new IllegalArgumentException("AbstractObserver 中的泛型参数必填");
        }
        ObserverClass = (Class<T>) types[0];;
    }

    /**
     * 重写该方法，当DelayedTaskEntity任务到底期限，该方法会被回调
     * 注意：若有多个AbstractObserver同时监听相同的Class任务该方法会多个AbstractObserver同时触发
     * @param delayedTask 延迟任务对象
     */
    protected abstract void task(DelayedTaskEntity<T> delayedTask);

    @Override
    @SuppressWarnings("unchecked")
    public void call(DelayedTaskEntity<?> delayedTask) {
        task((DelayedTaskEntity<T>) delayedTask);
    }
}
